#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>


void daemonize( void )
{
	pid_t pid, sid;
	/* données qui peut recevoir l'identifiant d'un processus
	(ce que l'on appelle le pid: process identifier) et qui sont
	par définition des entiers */

	pid = fork();
	/* création d'un processus appelé processus fils qui fonctionne
	en parallèle du premier processus appelé processus père */

	if( pid < 0)
		exit( EXIT_FAILURE );
	else if( pid > 0)
		exit( EXIT_SUCCESS );
	/* fork ne renvoit pas la même chose au deux processus.
	> pour le fils il renvois 0
	> pour le père il renvois le pid du fils dans mon cas on arrête le
	programme pour le père */

	umask(0);
	/* donne les droit par défaut 0777 */

	sid = setsid();
	/* setsid obtient pour valeur le pid du processus fils mais échoue
	dans certains cas comme par exemple celui ou le processus fils à le
	même pid qu'un processus déjà existant */

	if( sid < 0 )
	{
		perror( "daemonize::sid" );
		exit( EXIT_FAILURE );
	}
	/* en cas d'échec de setsid on a sid < 0 et alors on interrompt la
	procedure */

	if( chdir("/") < 0 )
	{
		perror( "daemonize::chdir" );
		exit( EXIT_FAILURE );
	}

	chdir( "/usr/sbin" );
	/* changement du dossier ou s'execute le processus courant (ici le fils)
	je le met dans le même dossier que mon code source */

	close( STDIN_FILENO );
	close( STDOUT_FILENO );
	close( STDERR_FILENO );
	/* le fils partage les descripteurs de fichier du père sauf si on les
	ferme et dans ce cas ceux du père ne seront pas fermés */
}

int main( void )
{
	daemonize();
	while( 1 )
	{
		/* debut programme */
		/* fin programme */
	}
	return( EXIT_SUCCESS );
}
